home *** CD-ROM | disk | FTP | other *** search
- ;OCL{{{}}}
- ;OCL{{{ comments
- ; :-)
- ; try it
- ;OCL}}}
- @if-using not(ocl-file-towers)
- @use (ocl-file-towers)
- ;OCL{{{ libs
- @if-using not(ocl-file-delchar) @lib delchar @fi
- @if-using not(ocl-file-error) @lib error @fi
- ;OCL}}}
- ( demand-load (
- ;OCL{{{ variables
- ( defvar ( towers-active ) )
- ;OCL}}}
- ;OCL{{{ using a string - towers-of-hanoi
- ;OCL{{{ vars
- ( defvar
- ( tower-height
- tower-move
- delay-time
- )
- )
- ;OCL}}}
- ;OCL{{{ towers-string
- ;OCL{{{ move towers
- ;OCL{{{ delay
- ( deffun delay ( end-of-line show-cursor delay-time ) )
- ;OCL}}}
- (defmac move-towers (
- if <>(tower-height 0) (
- set tower-height +(tower-height -1)
- ;OCL{{{ handle cases
- if =(tower-move 0)
- ;OCL{{{ 0=1->2
- (
- set tower-move 1
- move-towers
- end-of-line
- delete-previous-character
- next-line
- end-of-line
- undo-delete-character
- previous-line
- delay
- set tower-move 5
- move-towers
- )
- ;OCL}}}
- else (
- set tower-move +(tower-move -1)
- if =(tower-move 0)
- ;OCL{{{ 1=1->3
- (
- set tower-move 0
- move-towers
- end-of-line
- delete-previous-character
- next-line
- next-line
- end-of-line
- undo-delete-character
- previous-line
- previous-line
- delay
- set tower-move 3
- move-towers
- )
- ;OCL}}}
- else (
- set tower-move +(tower-move -1)
- if =(tower-move 0)
- ;OCL{{{ 2=2->1
- (
- set tower-move 3
- move-towers
- next-line
- end-of-line
- delete-previous-character
- previous-line
- end-of-line
- undo-delete-character
- delay
- set tower-move 4
- move-towers
- )
- ;OCL}}}
- else (
- set tower-move +(tower-move -1)
- if =(tower-move 0)
- ;OCL{{{ 3=2->3
- (
- set tower-move 2
- move-towers
- next-line
- end-of-line
- delete-previous-character
- next-line
- end-of-line
- undo-delete-character
- previous-line
- previous-line
- delay
- set tower-move 1
- move-towers
- )
- ;OCL}}}
- else (
- set tower-move +(tower-move -1)
- if =(tower-move 0)
- ;OCL{{{ 4=3->1
- (
- set tower-move 5
- move-towers
- next-line
- next-line
- end-of-line
- delete-previous-character
- previous-line
- previous-line
- end-of-line
- undo-delete-character
- delay
- set tower-move 2
- move-towers
- )
- ;OCL}}}
- else
- ;OCL{{{ 5=3->2
- (
- set tower-move 4
- move-towers
- next-line
- next-line
- end-of-line
- delete-previous-character
- previous-line
- end-of-line
- undo-delete-character
- previous-line
- delay
- set tower-move 0
- move-towers
- )
- ;OCL}}}
- fi
- )
- fi
- )
- fi
- )
- fi
- ) fi
- ;OCL}}}
- set tower-height +(tower-height 1)
- ) fi
- ))
- ;OCL}}}
- ( deffun towers-string (
- if not(test-text) ( failed ) fi
- beginning-of-line
- newline-and-indent
- previous-line
- "I " "play " "the " "towers " "of " "hanoi
- newline-and-indent
- "==========================
- next-line
- beginning-of-line
- set tower-height 0
- set tower-move 0
- while not(test-end-line)
- ( forward-character set tower-height +(tower-height 1) )
- case
- ( >(-(tower-height 8) 0) ( set delay-time 0 ) )
- ( >(-(tower-height 6) 0) ( set delay-time 1 ) )
- ( >(-(tower-height 4) 0) ( set delay-time 2 ) )
- default
- ( set delay-time 7 )
- esac
- beginning-of-line
- "tower " "1|
- end-of-line
- newline-and-indent
- "tower " "2|
- newline-and-indent
- "tower " "3|
- previous-line
- previous-line
- move-towers
- ))
- ;OCL}}}
- ( deffun towers-of-hanoi
- ( set towers-active true
- towers-string
- set towers-active false
- load-function not( towers-string delay )
- )
- )
- ;OCL{{{ undeclare
- ( undeclare ( tower-height towers-string tower-move delay move-towers ) )
- ;OCL}}}
- ;OCL}}}
- ;OCL{{{ show the towers on display - tower-display
- ;OCL{{{ variables
- ( defvar
- ( t-height
- top-line
- disc-size
- count
- i1
- i2
- )
- )
- ;OCL}}}
- ;OCL{{{ delay
- ( deffun delay ( if not(>(-(t-height 7) 0)) ( show-cursor 1 ) fi ) )
- ;OCL}}}
- ;OCL{{{ show-count
- ( deffun show-count
- ( message ( counter t-height ": " counter count " "moves )
- show-cursor 1
- )
- )
- ;OCL}}}
- ;OCL{{{ base-line
- ( deffun base-line
- ( while not( test-bottom ) ( next-line )
- beginning-of-line
- previous-line
- )
- )
- ;OCL}}}
- ;OCL{{{ go-tower
- ( deffun
- ( to )
- go-tower
- ( goto 1
- repeat +( *( -( to 1 ) +( disc-size 2 ) ) t-height 2 )
- ( forward-character )
- )
- )
- ;OCL}}}
- ;OCL{{{ move-and-display
- ( deffun
- ( move-height from to park )
- move-and-display
- ( if >(move-height 0)
- ( move-and-display ( -( move-height 1 ) from park to )
- ;OCL{{{ move over from-disc
- base-line
- go-tower ( from )
- do
- ( previous-line )
- while test-char "#
- ;OCL}}}
- ;OCL{{{ shift up
- add-mode-overwrite
- next-line
- while <>(-(store-line top-line) 0)
- ( previous-line
- ;OCL{{{ clear disc
- screen-off
- next-line
- "|
- repeat move-height ( " )
- repeat +( 1 move-height move-height ) ( backward-character )
- repeat move-height ( " )
- screen-on
- refresh-line
- ;OCL}}}
- previous-line
- ;OCL{{{ draw disc
- screen-off
- repeat +( move-height 1 ) ( "# )
- repeat +( 1 move-height move-height ) ( backward-character )
- repeat move-height ( "# )
- screen-on
- refresh-line
- ;OCL}}}
- delay
- )
- delete-mode-overwrite
- ;OCL}}}
- ;OCL{{{ shift left or right
- beginning-of-line
- set i2 5
- set i1 -( to from )
- while >(i1 0)
- ( repeat +( disc-size 2 )
- ( " ;
- if pre ( set i2 -( i2 1 ) ) not(>(i2 0))
- ( delay
- set i2 5
- )
- fi
- )
- set i1 -( i1 1 )
- )
- while <>(i1 0)
- ( repeat +( disc-size 2 )
- ( delete-previous-character
- if pre ( set i2 -( i2 1 ) ) not(>(i2 0))
- ( delay
- set i2 5
- )
- fi
- )
- set i1 +( i1 1 )
- )
- ;OCL}}}
- ;OCL{{{ shift down
- add-mode-overwrite
- go-tower ( to )
- next-line
- set i1 " ;
- do
- ( previous-line
- ;OCL{{{ clear disc
- screen-off
- insert-ascii i1
- set i1 "|
- repeat move-height ( " )
- repeat +( 1 move-height move-height ) ( backward-character )
- repeat move-height ( " )
- screen-on
- refresh-line
- ;OCL}}}
- next-line
- ;OCL{{{ draw disc
- screen-off
- repeat +( 1 move-height ) ( "# )
- repeat +( 1 move-height move-height ) ( backward-character )
- repeat move-height ( "# )
- screen-on
- refresh-line
- ;OCL}}}
- next-line
- )
- while test-char "|
- delete-mode-overwrite
- ;OCL}}}
- set count +( count 1 )
- show-count
- move-and-display ( -( move-height 1 ) park to from )
- )
- fi
- )
- )
- ;OCL}}}
- ;OCL{{{ tower-mac-dsp
- ( deffun tower-mac-dsp
- (
- ;OCL{{{ get size
- set t-height read-repeat
- if <=(t-height 0) ( set t-height 5 ) fi
- set disc-size +( 1 t-height t-height )
- ;OCL}}}
- ;OCL{{{ draw tower
- screen-off
- add-mode-overwrite
- end-of-fold
- beginning-of-line
- repeat +( 4 t-height ) ( newline-and-indent )
- ;OCL{{{ show base-line
- base-line
- repeat +( 2 *( 3 +( disc-size 2 ) ) ) ( "= )
- ;OCL}}}
- ;OCL{{{ draw sticks and discs
- set i1 1
- set i2 disc-size
- do
- (
- ;OCL{{{ move to line
- base-line
- local
- ( i1 )
- ( do
- ( previous-line
- set i1 -( i1 1)
- )
- while >(i1 0)
- )
- ;OCL}}}
- ;OCL{{{ draw sticks
- go-tower ( 1 )
- "|
- go-tower ( 2 )
- "|
- go-tower ( 3 )
- "|
- ;OCL}}}
- if >(-( i2 1 ) 0)
- ;OCL{{{ draw disc
- ( go-tower ( 1 )
- repeat div( i2 2 )
- ( backward-character )
- repeat i2
- ( "# )
- )
- ;OCL}}}
- fi
- set i1 +( i1 1 )
- set i2 -( i2 2 )
- set top-line -( store-line 1 )
- )
- while >(i2 0)
- ;OCL}}}
- delete-mode-overwrite
- ;OCL{{{ scroll towers out and in again
- base-line
- ;OCL{{{ get scroll width
- set i1 +( 2 *( 3 +( disc-size 2 ) ) )
- if >(-( screen-width i1 ) 0)
- ( set i1 screen-width )
- fi
- ;OCL}}}
- ;OCL{{{ scroll out
- while <>(top-line store-line)
- ( repeat i1 ( " backward-character )
- previous-line
- )
- ;OCL}}}
- ;OCL{{{ scroll in
- screen-on
- redraw-display
- repeat i1
- ( screen-off
- goto-line-counter +( top-line 1 )
- do
- (
- ;OCL{{{ line from right
- goto 1
- delete-character
- next-line
- ;OCL}}}
- ;OCL{{{ line from left
- if not( test-bottom )
- ( goto +( i1 i1 )
- if test-end-line
- ;OCL{{{ space at front
- ( goto 1 " )
- ;OCL}}}
- else
- ;OCL{{{ last char at front
- ( delete-character
- goto 1
- undo-delete-character
- )
- ;OCL}}}
- fi
- next-line
- )
- fi
- ;OCL}}}
- )
- while not( test-bottom )
- screen-on
- redraw-display
- show-cursor 0
- )
- redraw-display
- ;OCL}}}
- delay
- ;OCL}}}
- ;OCL}}}
- ;OCL{{{ do the move!
- set count 0
- move-and-display ( t-height 1 3 2 )
- redraw-display
- show-count
- ;OCL}}}
- )
- )
- ;OCL}}}
-
- ( deffun tower-display
- ( set towers-active true
- load-function
- ( tower-mac-dsp
- move-and-display
- go-tower
- base-line
- show-count
- delay
- )
- tower-mac-dsp
- set towers-active false
- load-function not
- ( tower-mac-dsp
- move-and-display
- go-tower
- base-line
- show-count
- delay
- )
- )
- )
- ;OCL{{{ undeclare
- ( undeclare
- ( t-height
- count
- top-line
- disc-size
- i1
- i2
- delay
- go-tower
- base-line
- show-count
- tower-mac-dsp
- move-and-display
- )
- )
- ;OCL}}}
- ;OCL}}}
- ;OCL{{{ undeclares
- ( undeclare ( towers-active ) )
- ;OCL}}}
- ) )
- @fi
-